package ar.frba.utn.diseñosistemas.TP2;

import java.util.ArrayList;

import com.lanchita.AerolineaLanchita;

public class LanchitaAdapter implements IAerolinea {

	private int porcentajeImpuesto = 15;
	private AerolineaLanchita lanchita;
	
	public LanchitaAdapter()
	{
		this.lanchita = AerolineaLanchita.getInstance();
	}	
	
	@Override
	public void Comprar(Asiento unAsiento) {
		
		this.lanchita.comprar(unAsiento.getCodigo());
	}

	@Override
	public ArrayList<Asiento> Buscar(Busqueda unaBusqueda) {
		
		String[][] resultado = this.lanchita.asientosDisponibles(unaBusqueda.getOrigen(), unaBusqueda.getDestino(), unaBusqueda.getFechaSalida(), null, unaBusqueda.getFechaLlegada(), null);
		
		ArrayList<Asiento> asientos = new ArrayList<Asiento>();
		for (String[] infoAsiento : resultado) {
			Asiento unAsiento = this.parseAsiento(infoAsiento);
			this.AplicarImpuestoA(unAsiento);
			asientos.add(unAsiento);
		}
		
		return asientos;
	}

	private void AplicarImpuestoA(Asiento unAsiento)
	{
		float precio = unAsiento.getPrecio();
		
		precio += (precio * porcentajeImpuesto) / 100;
		
		unAsiento.setPrecio(precio);
	}
	
	private Asiento parseAsiento(String[] info)
	{
		Float precio = Float.parseFloat(info[1]);
		Clase clase = this.parseClase(info[2]);
		Ubicacion ubicacion = this.parseUbicacion(info[3]);
		EstadoAsiento estado = this.parseEstado(info[4]);
		
		return new Asiento(info[0], precio, clase, ubicacion, estado, this);
	}

	private EstadoAsiento parseEstado(String estado) {
		
		if (estado.equalsIgnoreCase("D"))
			return EstadoAsiento.Disponible;
		if (estado.equalsIgnoreCase("R"))
			return EstadoAsiento.Reservado;
		if (estado.equalsIgnoreCase("C"))
			return EstadoAsiento.Comprado;
		
		throw new RuntimeException("El servicio devolvio un estado invalido: " + estado);
	}

	private Ubicacion parseUbicacion(String ubicacion) {
		
		if (ubicacion.equalsIgnoreCase("C"))
			return Ubicacion.Centro;
		if (ubicacion.equalsIgnoreCase("P"))
			return Ubicacion.Pasillo;
		if (ubicacion.equalsIgnoreCase("V"))
			return Ubicacion.Ventanilla;
		
		throw new RuntimeException("El servicio devolvio una ubicacion invalida: " + ubicacion);
	}

	private Clase parseClase(String clase) {
		
		if (clase.equalsIgnoreCase("C"))
			return Clase.Turista;
		if (clase.equalsIgnoreCase("E"))
			return Clase.Ejecutivo;
		if (clase.equalsIgnoreCase("P"))
			return Clase.Primera;
		
		throw new RuntimeException("El servicio devolvio una clase invalida: " + clase);
	}
}
